package com.ys.service.sys.impl;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bo.enume.sys.StatusEnum;
import com.ys.entity.shiro.LoginUser;
import com.ys.entity.sys.SysImgcode;
import com.ys.entity.sys.TbCompanyInfo;
import com.ys.entity.sys.TsOperateOrg;
import com.ys.entity.sys.TsOrganizationInfo;
import com.ys.entity.sys.TsUserInfo;
import com.ys.mapper.sys.SysImgcodeMapper;
import com.ys.service.sys.ImgcodeService;
import com.ys.util.ReqUtil;
import com.ys.util.shiro.ShiroUtils;

@Service("imgcodeService")
public class ImgcodeServiceImpl implements ImgcodeService {

	@Autowired
	private SysImgcodeMapper sysImgcodeMapper;

	@Override
	public void getImgCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String ip = ReqUtil.getIpAddr(request);
		
		int width = 63;
		int height = 37;
		Random random = new Random();
		// 设置response头信息
		// 禁止缓存
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		// 生成缓冲区image类
		BufferedImage image = new BufferedImage(width, height, 1);
		// 产生image类的Graphics用于绘制操作
		Graphics graphics = image.getGraphics();
		// Graphics类的样式
		graphics.setColor(this.getRandColor(200, 250));
		graphics.setFont(new Font("Times New Roman", 0, 28));
		graphics.fillRect(0, 0, width, height);
		// 绘制干扰线
		for (int i = 0; i < 40; i++) {
			graphics.setColor(this.getRandColor(130, 200));
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int x1 = random.nextInt(12);
			int y1 = random.nextInt(12);
			graphics.drawLine(x, y, x + x1, y + y1);
		}

		// 绘制字符
		String code = "";
		for (int i = 0; i < 4; i++) {
			String rand = String.valueOf(random.nextInt(10));
			code = code + rand;
			graphics.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
			graphics.drawString(rand, 13 * i + 6, 28);
		}
		
//		// 清除本IP的其它验证码
//		sysMapper.deleteImgcodeByIp(ip);
		
		// 将验证码保存到数据库
		SysImgcode imgcode = SysImgcode.sysImgcode(ip, code, StatusEnum.ON_USED.value);
		sysImgcodeMapper.insert(imgcode);

		graphics.dispose();

		ImageIO.write(image, "JPEG", response.getOutputStream());
		response.getOutputStream().flush();
	}

	// 创建颜色
	Color getRandColor(int fc, int bc) {
		Random random = new Random();
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	@Override
	public void doAuthAfterLogin(TsUserInfo tsUserInfo) {
		
	    // 获取当前用户
	    Subject subject = SecurityUtils.getSubject();
	    Session session = subject.getSession();
	    // 设置过期时间为24小时
	    session.setTimeout(1000L * 60 * 60 * 24);
	    // 封装用户的登录数据
	    UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(tsUserInfo.getUserId(), tsUserInfo.getUserPassWord());
        subject.login(usernamePasswordToken); // 执行登录的方法，如果没用一场就说明ok了
        
        LoginUser loginUser = new LoginUser();
        loginUser.setRoleId(tsUserInfo.getRoleId());
        loginUser.setRoleName(tsUserInfo.getRoleName());
        loginUser.setUserId(tsUserInfo.getUserId());
        loginUser.setUserName(tsUserInfo.getUserName());
        loginUser.setOrgId(tsUserInfo.getOrgId());
        loginUser.setDeptId(tsUserInfo.getDeptId());
        loginUser.setCid(tsUserInfo.getCompanyVid());
        
        TbCompanyInfo tbCompanyInfo = new TbCompanyInfo().setVid(tsUserInfo.getCompanyVid()).queryFirst();
        loginUser.setCidName(tbCompanyInfo.getVname());
        
//        // 查找运营公司
//        List<ThrOperateCompanyApply> listThrOperateCompanyApply = new ThrOperateCompanyApply()
//        		.setCUser(tsUserInfo.getUserId()).queryList();
//        for(ThrOperateCompanyApply thrOperateCompanyApply : listThrOperateCompanyApply) {
//        	
//        }
//        if (thrOperateCompanyApply != null) {
//        	loginUser.setOperateId(thrOperateCompanyApply.getVGsBm());
//		}
        
        TsOrganizationInfo tsOrganizationInfo = new TsOrganizationInfo().setId(tsUserInfo.getOrgId()).queryFirst();
        loginUser.setOrgName(tsOrganizationInfo.getOrgName());
        
        // 最高运营机构
        TsOperateOrg tsOperateOrg = new TsOperateOrg()
        		.addLeftJoin("THR_OperateCompanyApply B ON B.Vgsbm = A.HeadVgsbm")
        		.addLeftJoin("TS_UserChange C ON C.Id = B.OperatorChangeId")
        		.where("C.UserId = '" + tsUserInfo.getUserId() + "'")
        		.queryFirst();
        if (tsOperateOrg != null) {
        	loginUser.setOperateOrgId(tsOperateOrg.getId());
        	loginUser.setOperateOrgName(tsOperateOrg.getName());
        	loginUser.setOperateOrgNodeLft(tsOperateOrg.getNodeLft());
        	loginUser.setOperateOrgNodeRgt(tsOperateOrg.getNodeRgt());
		} else {
        	loginUser.setOperateOrgId(0L);
        	loginUser.setOperateOrgName("");
        	loginUser.setOperateOrgNodeLft(0L);
        	loginUser.setOperateOrgNodeRgt(0L);
		}
        ShiroUtils.setSysUser(loginUser);
        
        ShiroUtils.getSubject().hasRole("登录");
	}
}
